package com.example.combinecode.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author JY
 * @Date 2020/10/30 00:00
 **/
public class CombineCodes {

    public  static Logger logger= LoggerFactory.getLogger(CombineCodes.class);

    /**
     * 需要统计的项目java文件所在目录，默认当前目录
     */
    public static String javaFilesPath="";

    /**
     * 统计代码行数
     */
    public static Integer countCode = 0;

    /**
     * 统计出来的文件名称，样例D:/CountFileName.txt
     */
    public static String allFileNames="AllJavaFileNames.txt";

    /**
     * 统计出来的所有java代码
     */
    public static String allJavaCodes="AllJavaCodes.txt";

    /**
     * 统计所有java文件的文件数量和java代码行数
     * @param projectPath 需要
     * @return
     */
    public static int runJavaTotal(String projectPath){
        try {
            if (!projectPath.isEmpty()) {
                javaFilesPath=projectPath;
            }
            File allFile = new File(allFileNames);//新建需要统计的所有java文件的名字汇总
            PrintWriter pw = new PrintWriter(new FileWriter(allFile));

            List<File> fileList = CombineCodes.getAllFiles(javaFilesPath);
            for (File file : fileList) {
                String javaFileName = file.getAbsolutePath().replace("\\", "/");
                if(javaFileName.endsWith(".java")){
                    pw.println(javaFileName);
                }
            }
            CombineCodes.countJavaLine(fileList);
            pw.println("java文件总数量 ：" + fileList.size());
            pw.println("java代码总行数："+ countCode);
            pw.close();
            System.err.println("java文件总数量："+fileList.size());
            System.err.println("java代码总行数：" + countCode);

        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }

        return countCode;
    }
    /**
     * 递归获取path目录下所有的java文件
     * @param path 获取文件的路径
     * @return
     */
    public static List<File> getAllFiles(String path){
        List<File> fileList = new ArrayList<File> ();
        try {
            File filePath = new File(path);
            File[] files = filePath.listFiles();//listFiles能够获取当前文件夹下的所有文件和文件夹
            for (File file : files) {
                if(file.isFile() && file.getName().endsWith(".java")){
                    fileList.add(file);
                }else {
                    fileList.addAll(fileList.size(), getAllFiles(file.getPath()));
                }
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }

        return fileList;
    }

    /**
     * 统计项目中java代码的行数,将文件写入到D盘，用于将代码读取到txt后缀的文件名
     * @param listFile 文件的集合
     */
    public static void countJavaLine(List<File> listFile){
        try {

            File filetxtPath = new File(allJavaCodes);//输出要统计所有代码信息
            PrintWriter pw = new PrintWriter(new FileWriter(filetxtPath));
            for (File file : listFile) {
                if(file.getName().endsWith(".java")){
                    FileReader fr = new FileReader(file);
                    BufferedReader br = new BufferedReader(fr);
                    String line = "";
                    while((line = br.readLine()) != null){
                        countCode ++;
//						logger.info(line);//将所有代码打印到console
                        pw.println(line);
                    }
                }
            }
            pw.close();
        } catch (Exception e) {
            System.err.println("统计java代码行数出错!");
        }

    }
}
